// JavaScript Document
((function(ths){
	//工具函数集合
var strtoupper = function(s){ return s?s.toUpperCase():null;};
var strtolower = function(s){ return s?s.toLowerCase():null;};
var strtoworder = function(s){
	return s.slice(0,1).toUpperCase()+ s.slice(1)
};

//复制一个对象，复制的对象跟原来的样，但是不会跟原来的一样
KuoqiAppjs.copy = function(objSource){
	//判断数据类型
	function getClass(o) { 
		return Object.prototype.toString.call(o).slice(8, -1);
	}
	function deepCopy(obj) {
		var result, oClass = getClass(obj);
		if (oClass == "Object") result = {}; //判断传入的如果是对象，继续遍历
		else if (oClass == "Array") result = []; //判断传入的如果是数组，继续遍历
		else return obj; //如果是基本数据类型就直接返回
		for (var i in obj) {
			var copy = obj[i];
	
			if (getClass(copy) == "Object") result[i] = deepCopy(copy); //递归方法 ，如果对象继续变量obj[i],下一级还是对象，就obj[i][i]
			else if (getClass(copy) == "Array") result[i] = deepCopy(copy); //递归方法 ，如果对象继续数组obj[i],下一级还是数组，就obj[i][i]
			else result[i] = copy; //基本数据类型则赋值给属性
		}
	
		return result;
	}
	return deepCopy(objSource);
}

//循环
//转用于循环打列表的
//通用于索引数组与关联数组
//才怪
var foreach = function(data,callback){
	for(var i in data){
		KuoqiAppjs.app._tmp_callback_foreach = callback;
		KuoqiAppjs.app._tmp_callback_foreach(i,data[i],data);	
	}
}

//用于数组打列表
var foreachByarray = function(data,callback){
	for(var i = 0;i<data.length;i++){
		KuoqiAppjs.app._tmp_callback_foreachbyarray = callback;
		KuoqiAppjs.app._tmp_callback_foreachbyarray(i,data[i],data);	
	}
}

//url的链接字符串转换为键值对数组
var urlstr2params = function(url){
	
	//判定url不存在
	if(!url){
		return {};	
	}
	
	//url已经存在
	var a = url.split('&');
	var b = {};
	for(var i = 0;i<a.length;i++){
		var t = a[i].split('=');
		b[t[0]] = t[1];
		}
	return b;
}
	
//键值对转urlstring
var hash2urlstr = function(params){
	var o = '';
	for(var i in params){
		o += o?('&'+i+'='+params[i]):(i+'='+params[i]);
		}
	return o;
}

//关于路径转路径
//也可输入对象信息尝试提取里面的路径
var getTPath = function(path){
	if(typeof(path)=='object'){
		if(path.path){
			
			path = path.path;
			path = KuoqiAppjs.home+path;
			
		}else if(path.route){
			
			//如果是以路由形式存在，则使用路由的使用规则
			path = KuoqiAppjs.route.route2file(path.route);
			//将路径信息补全
			path = KuoqiAppjs.home+path;
			
			
		}else if(path.url){
			
			//如果是完整的url路径信息，则自动获取该资源
			//该资源不需要参数
			//不需要参数
			path = path.url;
				
		}else{
			
			//todo--
			KuoqiAppjs.error('[KuoqiAppjs.loader.loadJs]的输入必须为路径的string，或者带路径属性[path]或待路由属性[:route]的对象');
			KuoqiAppjs.app.callback&&KuoqiAppjs.app.callback({});
			
		}	
	}else{
		path = KuoqiAppjs.home+path;
	}
	
	if(KuoqiAppjs.version){
		path = path+'?v='+KuoqiAppjs.version	
	}
	
	return path;
}

//补充对象的值
var setObjectdata = function(object,nameString,v){
	var tlen = 0;
	var tobj = object;
	while((tlen = nameString.indexOf('.'))>0){
		var tmp = nameString.substr(0,tlen);
		if(!tobj[tmp]){ tobj[tmp] = {};}
		tobj = tobj[tmp];
		nameString = nameString.substr(tlen+1);
	}
	tobj[nameString] = v;
	return object;
}

//2022/02/04
var route2path = function(route){
	//判定是否为路由信息，路由只包含英文字母，数字及点号
	var tmp = route.replace(/^[0-9a-zA-Z\.]+$/g,function(rs0,rs1){
		return '/'+rs0.replace(/\./g,function(rs){ return '/';})+'.js';
	});
	if(tmp){
		route = tmp;	
	}
	
	return route;
}

KuoqiAppjs.tools = {
	strtoupper:strtoupper,
	strtolower:strtolower,
	strtoworder:strtoworder	,
	foreach:foreach,//循环数据信息
	foreachByarray:foreachByarray,//
	urlstr2params:urlstr2params,
	hash2urlstr:hash2urlstr,
	getTPath:getTPath,//关于转换为真实路径的模块
	setObjectdata:setObjectdata,//补充对象的值
	route2path:route2path,//路由转换为路径的函数，2022/02/04
}

})())
